﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __BF23487B_B81B_43B0_AFBD_2171760FA36E__
#define __BF23487B_B81B_43B0_AFBD_2171760FA36E__

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

namespace xos_box
{
    class i_list;

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // i_release对象通用创建者函数
    // 
    typedef int( *v_create )( xos::i_release ** ppv );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // variant
    // 
    class i_property;

    class i_variant : public xos::i_release
    {
    public:
        enum VT_TYPE {
            VT_UNKNOWN,
            VT_CREATE_FUNCTION,
            VT_PROPERTY,
            VT_OBJECT,
            VT_LIST,
            VT_STRING,
            VT_DOUBLE,
            VT_FLOAT,
            VT_INT,
            // 为了支持bean类及数据库操作加入的，其它场景不需要。
            VT_CHAR_ARRAY,
            VT_BIN_PTR,
            VT_DOUBLE_PTR,
            VT_FLOAT_PTR,
            VT_BOOL_PTR,
            VT_U64_PTR,
            VT_I64_PTR,
            VT_U32_PTR,
            VT_I32_PTR,
            VT_U16_PTR,
            VT_I16_PTR,
            VT_U8_PTR,
            VT_I8_PTR
        };

    public:
        virtual ~i_variant(){}

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        // get
        // 

        virtual const char * str( char * lpszValue = 0, int nBufSize = 0, int * lpnSizeNeeded = 0 ) = 0;
        virtual xos::i_release * obj( xos::i_release ** ppv ) = 0;
        virtual xos_box::i_list * list( xos_box::i_list ** ppv ) = 0;
        virtual i_property * prop( i_property ** ppv ) = 0;
        virtual i_property * attr( i_property ** ppv ) = 0;
        virtual v_create fun( v_create * pv = 0 ) = 0;
        virtual double dbl( double * lpdValue = 0 ) = 0;
        virtual float flt( float * lpfValue = 0 ) = 0;
        virtual int it( int  * lpnValue = 0 ) = 0;

        virtual xos::xos_u64 * u64_ptr( xos::xos_u64 ** lppRet ) = 0;
        virtual xos::xos_i64 * i64_ptr( xos::xos_i64 ** lppRet ) = 0;
        virtual xos::xos_u32 * u32_ptr( xos::xos_u32 ** lppRet ) = 0;
        virtual xos::xos_i32 * i32_ptr( xos::xos_i32 ** lppRet ) = 0;
        virtual xos::xos_u16 * u16_ptr( xos::xos_u16 ** lppRet ) = 0;
        virtual xos::xos_i16 * i16_ptr( xos::xos_i16 ** lppRet ) = 0;
        virtual xos::xos_u8 * u8_ptr( xos::xos_u8 ** lppRet ) = 0;
        virtual xos::xos_i8 * i8_ptr( xos::xos_i8 ** lppRet ) = 0;
        virtual char * char_array( char ** lppRet, int * lpnSize, int * lpnLen ) = 0;
        virtual char * bin_ptr( char ** lppRet, int * lpnSize, int * lpnLen ) = 0;
        virtual double * dbl_ptr( double ** lppRet ) = 0;
        virtual float * flt_ptr( float ** lppRet ) = 0;
        virtual bool * bool_ptr( bool ** lppRet ) = 0;

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        // set
        // 

        virtual int set( const char * lpszValue ) = 0;
        virtual int set_obj( xos::i_release * pv, bool bAutoRelease ) = 0;
        virtual int set_list( xos_box::i_list * pv, bool bAutoRelease ) = 0;
        virtual int set_prop( i_property * pv, bool bAutoRelease ) = 0;
        virtual int set_attr( i_property * pv ) = 0;
        virtual int set( v_create pv ) = 0;
        virtual int set( double value ) = 0;
        virtual int set( float value ) = 0;
        virtual int set( int value ) = 0;

        virtual int set( xos::xos_u64 * lpRef ) = 0;
        virtual int set( xos::xos_i64 * lpRef ) = 0;
        virtual int set( xos::xos_u32 * lpRef ) = 0;
        virtual int set( xos::xos_i32 * lpRef ) = 0;
        virtual int set( xos::xos_u16 * lpRef ) = 0;
        virtual int set( xos::xos_i16 * lpRef ) = 0;
        virtual int set_u8( xos::xos_u8 * lpRef ) = 0;
        virtual int set_i8( xos::xos_i8 * lpRef ) = 0;
        virtual int set_char_array( char * lpRef, int nBufSize ) = 0;
        virtual int set_bin( char * lpRef, int nBufSize ) = 0;
        virtual int set( double * lpRef ) = 0;
        virtual int set( float * lpRef ) = 0;
        virtual int set( bool * lpRef ) = 0;

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        // helper
        // 

        virtual VT_TYPE get_type( VT_TYPE * lpType ) = 0;
        virtual int set_type( VT_TYPE type ) = 0;
        virtual int set_ref_value( i_variant * pVT ) = 0;
    };

} // xos_common

#endif // __BF23487B_B81B_43B0_AFBD_2171760FA36E__
